const AVLTree = require("../template")

function testAVLTreeBalancing() {
  console.log(
    "1. 左左旋转测试:",
    (() => {
      const avl = new AVLTree()
      
      // 构造需要左左旋转的情况
      avl.insert(30)
      avl.insert(20)
      avl.insert(10)
      
      // 验证树结构正确且平衡
      return avl.isValid() === true &&
             avl.search(10) !== null &&
             avl.search(20) !== null &&
             avl.search(30) !== null
    })()
  )

  console.log(
    "2. 右右旋转测试:",
    (() => {
      const avl = new AVLTree()
      
      // 构造需要右右旋转的情况
      avl.insert(10)
      avl.insert(20)
      avl.insert(30)
      
      // 验证树结构正确且平衡
      return avl.isValid() === true &&
             avl.search(10) !== null &&
             avl.search(20) !== null &&
             avl.search(30) !== null
    })()
  )

  console.log(
    "3. 左右旋转测试:",
    (() => {
      const avl = new AVLTree()
      
      // 构造需要左右旋转的情况
      avl.insert(30)
      avl.insert(10)
      avl.insert(20)
      
      // 验证树结构正确且平衡
      return avl.isValid() === true &&
             avl.search(10) !== null &&
             avl.search(20) !== null &&
             avl.search(30) !== null
    })()
  )

  console.log(
    "4. 右左旋转测试:",
    (() => {
      const avl = new AVLTree()
      
      // 构造需要右左旋转的情况
      avl.insert(10)
      avl.insert(30)
      avl.insert(20)
      
      // 验证树结构正确且平衡
      return avl.isValid() === true &&
             avl.search(10) !== null &&
             avl.search(20) !== null &&
             avl.search(30) !== null
    })()
  )

  console.log(
    "5. 多次旋转测试:",
    (() => {
      const avl = new AVLTree()
      
      // 插入数据触发多次旋转
      const values = [50, 30, 70, 20, 40, 60, 80, 10, 25, 35, 45]
      values.forEach(val => avl.insert(val))
      
      // 验证所有值都存在且树结构正确
      const allFound = values.every(val => avl.search(val) !== null)
      
      return allFound &&
             avl.isValid() === true &&
             avl.getSize() === values.length
    })()
  )

  console.log(
    "6. 平衡因子测试:",
    (() => {
      const avl = new AVLTree()
      
      // 插入数据
      const values = [50, 30, 70, 20, 40, 60, 80]
      values.forEach(val => avl.insert(val))
      
      // 验证树平衡
      const isValid = avl.isValid()
      const height = avl.getHeight()
      
      return isValid === true &&
             height <= Math.ceil(Math.log2(values.length + 1)) // AVL树高度限制
    })()
  )

  console.log(
    "7. 高度更新测试:",
    (() => {
      const avl = new AVLTree()
      
      // 插入数据
      avl.insert(50)
      avl.insert(30)
      avl.insert(70)
      avl.insert(20)
      avl.insert(40)
      
      // 验证高度正确
      const height = avl.getHeight()
      const isValid = avl.isValid()
      
      return height > 0 &&
             height <= 3 && // AVL树高度限制
             isValid === true
    })()
  )

  console.log(
    "8. 旋转后中序遍历测试:",
    (() => {
      const avl = new AVLTree()
      
      // 插入数据
      const values = [50, 30, 70, 20, 40, 60, 80]
      values.forEach(val => avl.insert(val))
      
      // 获取中序遍历结果
      const inorder = avl.inorder()
      const expected = values.sort((a, b) => a - b)
      
      return JSON.stringify(inorder) === JSON.stringify(expected) &&
             avl.isValid() === true
    })()
  )

  console.log(
    "9. 旋转后最小最大值测试:",
    (() => {
      const avl = new AVLTree()
      
      // 插入数据
      const values = [50, 30, 70, 20, 40, 60, 80, 10, 25, 35, 45]
      values.forEach(val => avl.insert(val))
      
      const min = avl.getMin()
      const max = avl.getMax()
      const expectedMin = Math.min(...values)
      const expectedMax = Math.max(...values)
      
      return min === expectedMin &&
             max === expectedMax &&
             avl.isValid() === true
    })()
  )

  console.log(
    "10. this上下文平衡测试:",
    (() => {
      const balancingObj = {
        multiplier: 2,
        processBalancing: function(values) {
          const avl = new AVLTree()
          values.forEach(val => avl.insert(val))
          return avl.getSize() * this.multiplier
        }
      }
      
      const values = [10, 20, 30, 40, 50]
      return balancingObj.processBalancing(values) === 10 // 5*2=10
    })()
  )

  console.log(
    "11. 复杂对象this绑定平衡测试:",
    (() => {
      const balancingConfigObj = {
        config: { threshold: 3 },
        processWithConfig: function(values) {
          const avl = new AVLTree()
          values.forEach(val => avl.insert(val))
          return avl.getSize() >= this.config.threshold
        }
      }
      
      const values = [10, 20, 30]
      return balancingConfigObj.processWithConfig(values) === true
    })()
  )

  console.log(
    "12. 平衡一致性测试:",
    (() => {
      const avl1 = new AVLTree()
      const avl2 = new AVLTree()
      
      const values = [50, 30, 70, 20, 40, 60, 80]
      
      // 相同的数据插入顺序
      values.forEach(val => {
        avl1.insert(val)
        avl2.insert(val)
      })
      
      // 验证结果一致
      const inorder1 = avl1.inorder()
      const inorder2 = avl2.inorder()
      const isValid1 = avl1.isValid()
      const isValid2 = avl2.isValid()
      
      return JSON.stringify(inorder1) === JSON.stringify(inorder2) &&
             isValid1 === isValid2 &&
             isValid1 === true
    })()
  )
}

testAVLTreeBalancing()
